perm filename PW1[1,DBL]1 blob sn#016208 filedate 1972-12-12 generic text, type T, neo UTF8
00100	BEGIN
00200	EXPR ENTER();
00300	     BEGIN
00400	     PRINTSTR '"THE SYSTEM IS STARTED";
00500	   S;PRINTSTR '"
00600	
00700	            PLEASE TYPE IN A REQUEST
00800	                      
00900	 ...";
01000	     L←READ();
01100	     LHOLD←L;
01200	     IF NULL(L) THEN RETURN  '"THE SYSTEM IS ENDED.";
01300	     PRINT D(L);
01400	     GO S;
01500	     END;
01600	EXPR D(L);
01700	     BEGIN NEW FN, A, N, RELATEDF;
01800	     I←READINKNOWN();
01900	     KNOWNF←IDATA[1];
02000	     TARG←IDATA[2];
02100	     NARG←IDATA[3];
02200	     TRE←IDATA[4];
02300	     BA1←IDATA[5];
02400	     BA2←IDATA[6];
02500	     FN←L[1];
02600	     FN2←FN;
02700	     A←CDR(L);
02800	     N←LENGTH(A);
02850	     NVARIABLES←N;
02900	     RELATEDF←'(NIL NIL NIL NIL);
03000	     IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
03100	       ELSE RETURN K2(FN,A,N,RELATEDF);
03200	     END;
03300	EXPR INIT();
03400	     BEGIN
03500	      UNKNOWN ←'UNKNOWN;
03600	     INF←0;
03700	     ORD←'(NIL);
03800	     PRINTSTR '"TYPE IN HOW DEEPLY WE SHOULD RECURSE BEFORE
03900	       GIVING UP AS INFINITE LOOP (I SUGGEST 50) ...";
04000	     LIMINFBASE←READ();
04050	     LIMINF← LIMINFBASE;
04100	     TWICELIMINF ← LIMINF + LIMINF;
04200	     TRIPLELIMINF ← LIMINF + TWICELIMINF;
04300	     BA1←'(FN CAR CDR IDEN MINUS ATOM LISTP NUMBERP NULL
04400	     LIST CONST1  ZERO1
04500	        QUOTE EVAL LENGTH NOT HALF SUB1 ADD1 );
04600	     BA2←'(CONS PI12 PI22 FN2 LIST PLUS TIMES MEMBER APPEND 
04700	        GREATERP LESSP EQUAL AND OR NOT);
04800	     PRINTSTR '"TYPE IN MESSAGE LEVEL (I SUGGEST 3)...";
04900	     MSGLEVEL←READ();
05000	     KNOWNF ←'(CAR CDR CONS IDEN
05100	       PLUS TIMES MINUS
05200	       ATOM LISTP NUMBERP NULL
05300	       QUOTE EVAL
05400	       LENGTH MEMBER
05500	       GREATERP LESSP EQUAL
05600	       AND OR NOT 
05700	       HALF PI12 PI22 ZERO1 ZERO2 
05800	       CONST1 CONST2 SUB1 ADD1 LIST APPEND FN FN2);
05900	     SCHEMA←'(DE FN(L) (COND
06000	       ((EQUAL (F1 L) C1)  (F2 L))
06100	       ((EQUAL (F8 L) C3)  (F9 L))
06200	       ((OR (GT L) (AND (INFINITY ) ((CAR (GET F4 TARGS)) (F3 L))
06300	         ((CAR (GET F6 TARGS)) (F5 L))
06400	         ((CAR (GET F7 TARGS)) (F4 (F3 L)))
06500	         ((CADR (GET F7 TARGS)) (F6 (F5 L))) ))
06600	        (F7 (F4 (F3 L)) (F6 (F5 L))))
06700	       (T  C2)));
06800	     I ← EVAL(SCHEMA);
06900	     I←GS2(); I←EVAL(SCHEMA2);
07000	     NARGS←'NARGS; TARGS←'TARGS;TRES←'TRES;
07100	     RETURN PUTFORM();
07200	     END;
07300	EXPR IDEN(A); A;
07400	EXPR HALF(A); A/2;
07500	EXPR K1(FN,A,N,RELATEDF); 
07600	     BEGIN NEW I;
07700	     I← GET(FN,'NARGS);
07800	     IF I=N OR I=11 THEN RETURN EVAL(L);
07900	     PRINTSTR '"THIS FUNCTION TAKES EXACTLY";
08000	     PRIN1(I);
08100	     PRINTSTR '" ARGUMENT(S), BUT YOU USED IT WITH";
08200	     PRIN1(N); PRINTSTR '"ARGUMENT(S).
08300	         ARE WE DEFINING A NEW BUT CLOSELY
08400	        RELATED FUNCTION  Y OR N ...";
08500	      IF READ()='Y THEN RELATEDF[1,1]←FN
08600	       ELSE PRINTSTR '"ARE WE DEFINING A NEW FUNCTION HERE OR
08700	         NOT  Y OR N ..."
08800	         ALSO IF READ()='N THEN RETURN  '"IGNORING THE REQUEST ENTIRELY";
08900	     PRINTSTR '"PICK A NEW FUNCTION NAME TO REPLACE THIS NEWEST USE OF";
09000	     PRIN1 FN;
09100	     PRINTSTR '"...";
09200	     FN←READ();
09300	     FN2←FN;
09400	     IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
09500	     ELSE RETURN K2(FN,A,N,RELATEDF);
09600	     END;
09700	EXPR K2(FN,A,N,RELATEDF);
09800	     BEGIN NEW II,I;
09900	     PRINTSTR '"READY TO MAKE NEW FUNCTION. DO YOU WANT TO";
10000	     PRINTSTR '"  CHANGE YOUR REQUEST Y OR N...";
10100	     IF READ()='Y THEN RETURN  '"VERY WELL. IGNORING
10200	     THE REQUEST ENTIRELY";
10300	     FOR NEW J←1 TO LENGTH(KNOWNF)-1 DO 
10400	       PUTPROP(KNOWNF[J],NIL,'RVAL);
10500	     F1←NIL; F2←NIL; F3←NIL; F4←NIL; F5←NIL; F6 ←NIL; 
10600	      F7←NIL; F8←NIL;F9←NIL; F10←NIL; F11←NIL; F12←NIL;
10700	      F13←NIL; F14←NIL; F15←NIL; F16←NIL; F17←NIL;
10800	      F18←NIL; F19←NIL;     EXAMPLE←NIL;
10900	     CO←CDR(BA1); CO2 ←CDR(BA2);
11000	     ORDER2←<BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,
11100	       BA2,BA2,CO,CO,BA2,CO,CO>;
11200	     ORDER←<CO,CO,CO,BA1,CO,BA1,CO2>;
11300	          PRINTSTR '"FOR EACH OF THE FOLLOWINGS FUNCTIONS, TYPE 
11400	EITHER TH WORD STOP OR A FUNCTION NAME, A SPACE, AND THEN A
11500	     1/2/3/4/5, MEANING THAT THE FN. IS DEFINITELY/PROBABLY/POSSIBLY
11600	     /PROBABLY NOT/DEFINITELY NOT  RELATED TO"; 
11700	     PRIN1 (FN);
11800	     PRINT (KNOWNF);
11900	     FOR NEW J←1 TO LENGTH(KNOWNF) DO BEGIN
12000	   S;    I←READ();
12100	     IF I= 'STOP THEN GO SSS;
12200	     II←READ();
12300	     PUTPROP (I, II, 'RVAL);
12400	       IF MEMBER(II,'(1 2 3 4)) THEN 
12500	       RELATEDF[II] ← I CONS RELATEDF[II]
12600	          ELSE IF NOT(II=5) THEN
12700	        PRINTSTR '"NO,NO! TYPE IN ONE DIGIT FROM 1 TO 5!!!"
12800	       ALSO GO S;
12900	   SSS; END UNTIL I= 'STOP;
13000	     PRINTSTR '"DO YOU THINK RECURSION (OR AN AUXILLIARY FN. WILL
13100	     BE REQUIRED HERE  Y OR N OR M(FOR MAYBE) ...";
13200	     I←READ();
13300	     IF I='Y THEN RETURN REC(FN,A,N,RELATEDF)
13400	       ELSE RETURN NREC(FN,A,N,RELATEDF,I);
13500	     END;
13600	EXPR PUTFORM();
13700	     BEGIN NEW ID,NA,TA,TR;
13800	     TF←NIL;
13900	     IF MAKELISTS()=NIL THEN RETURN PRINTSTR '"MAKELISTS IS NIL";
14200	     PF←NIL;
14300	     PF[1]←'PF1; PF[2]←'PF2; PF[3]←'PF3; PF[4]← 'PF4;
14400	     PF[5]←'PF5; PF[6]←'PF6; PF[7]←'PF7;
14500	     PF[8]←'PF8; PF[9]←'PF9; P2F[1]←'P2F1; P2F[2]←'P2F2; 
14600	     P2F[3]←'P2F3; P2F[4]←'P2F4; P2F[5]←'P2F5; P2F[6]←'P2F6;
14700	     P2F[7]←'P2F7; P2F[8]←'P2F8; P2F[9]←'P2F9;
14800	      P2F[10]←'P2F10; P2F[11]←'P2F11;
14900	      P2F[12]←'P2F12; P2F[13]←'P2F13; P2F[14]←'P2F14;
15000	      P2F[15]←'P2F15; P2F[16]←'P2F16; P2F[17]←'P2F17;
15100	     P2F[18]←'P2F18; P2F[19]←'P2F19;
15200	     FOR NEW I←1 TO LENGTH(KNOWNF) DO   BEGIN
15250	     ID←KNOWNF[I];
15300	     NA←NARG[I];
15400	     PUTPROP(ID,NA,'NARGS);
15500	     TA←TARG[I];
15600	     PUTPROP(ID,TA,'TARGS);
15700	     TR←TRE[I];
15800	     PUTPROP(ID,TR,'TRES);
15900	     FOR NEW J←1 TO 9 DO PUTPROP(ID,TF[J,I],PF[J]);
16000	     FOR NEW J←1 TO 19 DO PUTPROP(ID,T2F[J,I],P2F[J]);
16050	     END;
16100	     PUTPROP('FN,2,'RVAL);
16200	     PUTPROP ('FN2,1,'RVAL);
16300	     PUTPROP('FALSE,'(ANY),TARGS);
16400	     PUTPROP('FALSE2,'(ANY ANY), TARGS);
16600	     END;
16700	EXPR MAKELISTS();
16800	     BEGIN
16900	     NARG ← '(1 1 2 11 11 11 1
17000	     1 1 1 1 1 1 1 2 11 11 11 11 11 11 1 2 2 1 
17100	      2 1 2 1 1 11 2 1 2);
17200	     TARG←'((LISTP) (LISTP) (ATOM LISTP) (ANY ANY)
17300	         (NUMBER NUMBER) (NUMBER NUMBER)
17400	       (NUMBER) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) 
17500	       (ANY LISTP) (NUMBER NUMBER)  (NUMBER NUMBER) (ANY ANY)
17600	       (ANY ANY) (ANY ANY) (ANY ANY) (NUMBER) (ANY ANY) (ANY ANY)
17700	       (ANY) (ANY ANY) (ANY) (ANY ANY) (NUMBER) (NUMBER)
17800	       (ANY) (ANYLIST ANYLIST) (ANY) (ANY ANY));
17900	     TRE←'(ANY LISTP LISTP ANY NUMBER NUMBER NUMBER
18000	       TF TF TF TF ANY ANY
18100	       NUMBER TF TF TF TF TF TF TF NUMBER ANY ANY NUMBER
18200	       NUMBER ANY ANY NUMBER NUMBER ANYLIST LIST ANY ANY);
18300	     TF[1]← '(7 7 0 5 0 0 14 5 14 14 10 25 14 10 0 0 0 0 0 0
18400	       14 10 0 0 25 0 25 0 10 10 14 0 0);
18500	     TF[2]← '(10 10 0 5 0 0 14 5 14 14 14 25 14 14 0 0 0 0 0 0
18600	       25 10 0 0 10 0 10 0 14 14 7 0 0);
18700	     TF[3] ← '(5 7 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
18800	       25 14 0 0 14 0 14 0 7 7 10 0 0);
18900	     TF[4] ← '(7 10 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19000	       14 10 0 0 25 0 25 0 10 10 14 0 5);
19100	     TF[5] ← '(7 5 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
19200	       25 14 0 0 14 0 14 0 7 7 7 0 0);
19300	     TF[6] ← '(10 7 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19400	       14 10 0 0 25 0 25 0 10 10 10 0 5);
19500	     TF[7] ← '(0 0 5 0 10 10 0 0 0 0 0 0 0 0 25 25 14 25 14 14
19600	       0 0 7 7 0 14 0 14 0 0 0 5 0);
19700	     TF[8]←TF[1]; TF[9]←TF[2];
19800	     I←GETT2F();
19900	     RETURN PRINTSTR '"SUCCESFUL END OF MAKELISTS";
20000	     END;
20100	EXPR FALSE(A); NIL;
20200	EXPR TRUE(A); T;
20300	EXPR GETEX(N8);
20400	     BEGIN NEW I;
20500	     N9 ← LENGTH(EXAMPLE) + 1;
20600	     IF N9=1 THEN RETURN PRIM(NIL);
20700	    S; PRINTSTR '"PLEASE GIVE ME AN EXAMPLE.";
20800	       PRINTSTR '" THE ARGUMENT LIST...";
20900	      EXAMPLE[N9,1]←READ();
21000	      PRINTSTR '"THE FUNCTION VALUE...";
21100	      EXAMPLE[N9,2]←READ();
21200	      PRINTSTR '"DID YOU MAKE AN ERROR?  ";
21300	      I←READ();
21400	      IF I='Y THEN GO S;
21500	      RETURN EXAMPLE[N9];
21600	     END;
21700	EXPR PI12(A,B); A;
21800	EXPR PI22(A,B); B;
21900	EXPR ZERO1(A); 0;
22000	EXPR ZERO2(A,B); 0;
22100	EXPR CONST1(A); 1;
22200	EXPR CONST2(A,B); NIL;
22300	EXPR INFINITY();
22400	     BEGIN
22500	     INF←INF+1;
22600	     RETURN  LESSP(INF,LIMINF);
22700	     END;
22800	EXPR REC(FN,A,N,RELATEDF);
22900	     BEGIN
23000	     NEW I,II,I1,I2,KK,JJ1,JJ2;
23100	    S; PRINTSTR '"WHICH:  TYPE AN R(RECURSION), A(AUX.FN.), OR
23200	     B(BOTH)...";
23300	     I←READ();
23400	     IF NOT(MEMBER(I,'(R A B))) THEN
23500	         PRINTSTR '"NO,NO!! TYPE R,A, OR B  ONLY..."
23600	      ALSO GO S;
23700	     IF NOT I='R THEN RETURN '"O.K. LET'S WORK ON THE AUX.FN.
23800	       TYPE IT IN AS IF IT WERE YOUR REQUEST:";
23900	     IF N=2 THEN I←PRIM2() ELSE
24000	     I←GETEX(1);
24100	     NEX←0;
24200	     PRINTSTR '"HOW MANY MORE EXAMPLES WILL YOU GIVE ME
24300	       (I SUGGEST 2) ....";
24400	      NEX←READ();
24500	     FOR NEW KK←1 TO NEX DO II←GETEX(KK+1);
24600	      L←CADAR(A);
24700	     NEX ← NEX + ONEX;
24800	     IF NOT(N=1) THEN  RETURN REC2(FN,A,N,RELATEDF);
24900	        I←'(ANY);
25000	     E←NIL; MA←T; MN←T; MAL←T; EXAMPLE[NEX+2,1]←L;
25100	     FOR NEW X←1 TO NEX+1 DO BEGIN E←EXAMPLE[X+1,1];
25200	     MA←MA AND ATOM(E); MN←MN AND NUMBER(E);
25300	     MAL←MAL AND ANYLIST(E); END; 
25400	     IF MAL THEN I←'(ANYLIST);
25500	     IF MA THEN I←'(ATOM);
25600	     IF MN THEN I←'(NUMBER);
25700	     PUTPROP('FN,I,'TARGS);
25800	     PUTPROP('FN,1,'NARGS);
25900	     PUTPROP('FN,'ANY,'TRES);
26000	     IHOLD←I;
26100	     PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS 
26200	       FOR THE FN?   MY GUESS IS"; PRINC (IHOLD);
26300	     PRINTSTR '"ANSWER Y IF YOU WANT TO MAKE A BETTER GUESS,
26400	             N IF YOU THINK THAT IT IS O.K. AS STATED ...  ";
26500	     I←READ(); IF I='Y THEN BEGIN PRINTSTR '"O.K. TYPE IN ONE
26600	     OF TH FOLLOWING WORDS: ANY ANYLIST LISTP NUMBER...";
26700	     I←READ(); 
26800	     PUTPROP('FN,<I>,'TARGS);
26900	     IHOLD←<I>;
27000	      END;
27100	     FOR NEW K←1 TO 7 DO
27200	     ORD[K]←INTERSECTION(RELATEDF[1]@
27300	       RELATEDF[2]@<'FN>@RELATEDF[3]
27400	       @RELATEDF[4],ORDER[K]);
27500	     ORD[8]←ORD[1]; ORD[9]←ORD[2];
27600	      FOR NEW K←1 TO 9 DO ORD[K]←RANK(K,ORD);
27700	     PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES
27800	         EVEN FURTHER?  Y OR N ...";  I←READ();
27900	     IF I='Y THEN FOR NEW X←1 TO 9 DO BEGIN
28000	       PRINT (<'ORD,X,ORD[X]>); PRINTSTR '"NOW RETYPE ORD[X]";
28100	     I ← READ(); IF NOT(I='S) THEN ORD[X]←I;
28200	 END;
28300	     IF C1=UNKNOWN THEN C1←T;
28400	     IF C3=UNKNOWN THEN C3←T;
28500	     I←NIL; II←NIL;
28600	     LIMINF←LIMINFBASE;
28700	     FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
28800	       F1←ORD[1,T1];
28900	     IF GREATERP(MSGLEVEL,0) THEN
29000	PRINT(<1,'T1,T1,'F1,F1,'L,L,'RELATEDF,RELATEDF,'ORD,ORD>);
29100	     IF FOR NEW X←2 TO NEX+1 ; AND BEGIN
29200	       E←EXAMPLE[X,1];
29300	       RETURN EVAL '((CAR (GET F1 TARGS)) E) ;
29400	       END AND
29500	     (GOODEX=NIL OR F1(GOODEX[1])=C1) THEN
29600	     FOR NEW T2←1 TO LENGTH(ORD[2]) DO BEGIN
29700	          F2←ORD[2,T2];
29800	     IF GREATERP(MSGLEVEL,1) THEN
29900	PRINT(<2,'T2,T2,'F2,F2>);
30000	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
30100	      E←EXAMPLE[X,1];
30200	       RETURN EVAL '((CAR (GET F2 TARGS)) E) ;
30300	        END  AND
30400	     (NOT(GOODEX) OR F2(GOODEX[1])=GOODEX[2]) THEN
30500	     FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
30600	       F8←ORD[8,T8];
30700	     IF GREATERP(MSGLEVEL,9) THEN PRINT(<8,'T8,T8,'F8,F8>);
30800	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
30900	       E←EXAMPLE[X,1];
31000	       RETURN EVAL '((CAR (GET F8 TARGS)) E); END AND
31100	     (GOODEX2=NIL OR F8(GOODEX2[1])=C3)  THEN
31200	     FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
31300	       F9←ORD[9,T9];
31400	     IF GREATERP (MSGLEVEL,10) THEN PRINT(<9,'T9,T9,'F9,F9>);
31500	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
31600	       E←EXAMPLE[X,1];
31700	       RETURN EVAL '((CAR (GET F9 TARGS)) E); END AND
31800	     (NOT(GOODEX2) OR F9(GOODEX2[1])=GOODEX2[2]) THEN
31900	     FOR NEW T3←1 TO LENGTH(ORD[3]) DO BEGIN
32000	       F3←ORD[3,T3];
32100	     IF GREATERP(MSGLEVEL,2) THEN
32200	  PRINT(<3,'T3,T3,'F3,F3>);
32300	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
32400	       E←EXAMPLE[X,1];
32500	       RETURN ( GT(E) OR  EVAL '((CAR (GET F3 TARGS)) E) );
32600	     END THEN
32700	     FOR NEW T4←1 TO LENGTH(ORD[4]) DO BEGIN
32800	     F4←ORD[4,T4];
32900	     IF F4='FN THEN LIMINF←TWICELIMINF;
33000	     IF GREATERP(MSGLEVEL,3) THEN
33100	  PRINT(<4,'T4,T4,'F4,F4,'GETF4TARGS,GET(F4,TARGS)>);
33200	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
33300	       E←EXAMPLE[X,1];
33400	       RETURN ( GT(E) OR  EVAL '((CAR (GET F4 TARGS)) (F3 E) )) ;
33500	       END THEN 
33600	     FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
33700	     F5←ORD[5,T5];
33800	     IF GREATERP(MSGLEVEL,4) THEN
33900	  PRINT (<5,'T5,T5,'F5,F5>);
34000	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
34100	       E←EXAMPLE[X,1];
34200	       RETURN (GT(E) OR EVAL '((CAR (GET F5 TARGS)) E)) ;
34300	       END THEN
34400	     FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
34500	     F6←ORD[6,T6];
34600	     IF F6='FN THEN LIMINF ← TRIPLELIMINF;
34700	     IF GREATERP(MSGLEVEL,5) THEN
34800	PRINT (<6,'T6,T6,'F6,F6,'(I HAVE CHOSEN LIMINF TO BE),LIMINF>);
34900	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
35000	       E←EXAMPLE[X,1];
35100	       RETURN ( GT(E) OR  EVAL '((CAR (GET F6 TARGS)) (F5 E) )) ;
35200	       END THEN
35300	     FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
35400	     F7←ORD[7,T7];
35500	     IF GREATERP(MSGLEVEL,6) THEN
35600	  PRINT (<7,'T7,T7,'F7,F7>);
35700	JJ1← FOR NEW KK←2 TO NEX+2; AND BEGIN E←EXAMPLE[KK,1];
35800	     RETURN (GT(E) OR
35900	       EVAL('((CAR (GET F7 TARGS)) (F4 (F3 E))))); END;
36000	JJ2← FOR NEW HH←2 TO NEX+2; AND BEGIN E←EXAMPLE[HH,1];
36100	     RETURN (GT(E) OR
36200	      EVAL ('((CADR (GET F7 TARGS)) (F6 (F5 E))))) 
36300	     ; END;
36400	     IF JJ1 AND JJ2 THEN  INF←0
36500	     ALSO I← FOR NEW X←2 TO NEX+1; AND BEGIN
36600	       INF←0;
36700	       E←EXAMPLE[X,1];
36800	       RETURN (EXAMPLE[X,2] = EVAL '(FN E)  );
36900	       END;
37000	     IF I THEN PRINTSTR '"
37100	                 HOORAY, HOORAY!!!
37200	                    SUCCESS!!
37300	            ";
37400	      RETURN I;
37500	     END UNTIL I
37600	     END UNTIL I
37700	     END UNTIL I
37800	     END UNTIL I
37900	     END UNTIL I
38000	     END UNTIL I
38100	     END UNTIL I
38200	     END UNTIL I
38300	     END UNTIL I;
38400	     IF GREATERP(MSGLEVEL,0) THEN
38500	      PRINT <'F123456789,F1,F2,F3,F4,F5,F6,F7,F8,F9,'C1234,C1,C2,C3,C4>;
38600	     KNOWNF← FN CONS KNOWNF; TARG ←GET('FN,'TARGS) CONS TARG;
38700	     NARG←N CONS NARG; TRE ← GET('FN,'TRES) CONS TRE;
38800	     BA1 ← FN CONS BA1; IF GREATERP(MSGLEVEL,2) THEN
38900	     PRINT <'KNOWNF,KNOWNF,
39000	       'TARGNARGTRE,TARG,NARG,TRE,'BA1,BA1>;
39100	     FINALIZE();
39200	     PUTPROP(FN,1,NARGS);
39300	     PUTPROP(FN,IHOLD,TARGS);
39400	        PUTPROP(FN,'(ANY),TRES);
39500	     FOR NEW J←1 TO 9 DO PUTPROP(FN,11,PF[J]);
39600	     RETURN FN
39700	     END;
39800	EXPR GT(E);
39900	     OR( GOODEX AND GOODEX[1]=E, GOODEX2 AND GOODEX2[1]=E);
40000	EXPR INTERSECTION(A,B);
40100	     BEGIN NEW III;
40200	     III←NIL;
40300	     FOR NEW JJJ IN A DO
40400	     IF MEMBER(JJJ,B) THEN III←  III @ <JJJ>;
40500	     RETURN III;
40600	     END;
40700	EXPR LISTP(A);AND( NOT(ATOM(A)), LENGTH(A) ≥ 1);
40800	EXPR ANY(A); T;
40900	EXPR NUMBER(A); NUMBERP(A);
41000	EXPR ANYLIST(A);OR(NULL(A),NOT(ATOM(A)));
41100	EXPR PRINTMATRIX();
41200	     BEGIN NEW J;
41300	     PRINTSTR '"FNAME   TF1    TF2    TF3    TF4    TF5    TF6    TF7    TF8    TF9";
41400	     FOR NEW I IN KNOWNF DO BEGIN
41500	     J← FOR NEW K IN PF COLLECT
41600	       <GET(I,K)>;
41700	        RETURN PRINT (I CONS J);
41800	       END;
41900	     END;
42000	EXPR PRIM(NIL);
42100	     BEGIN NEW I,I1,I2;
42200	     GOODEX←NIL;
42300	     GOODEX2 ← NIL;
42400	     F8←NIL;
42500	     F9←NIL;
42600	     ONEX ← 0;
42700	     F1 ← NIL;
42800	      F2 ← NIL;
42900	     PRINTSTR '"THERE IS SOME TRIVIAL (PRIMITIVE) CASE (OR TWO).
43000	       DO YOU KNOW ANYTHING ABOUT IT?  Y OR N ...";
43100	     I ← READ();
43200	     IF I ='N THEN BEGIN
43300	           IF GREATERP(MSGLEVEL,1) THEN PRINTSTR
43400	       '"ASSUMING C1 TO BE T, C2 TO BE UNKNOWN";
43500	       C1 ← T; C2 ← UNKNOWN;
43600	     C3←T; C4←UNKNOWN;
43700	       EXAMPLE[1] ← <C1,C2>;
43800	       RETURN NIL; END ALSO RETURN NIL;
43900	     PRINTSTR '"FOR SOME FUNCTIONS F1,F2 AND SOME CONSTANTS C1,C2
44000	       WHEN F1(ARGUMENT)=C1 THEN THE VALUE OF YOUR FN IS C2=F2(ARG)
44100	          NOTE: C2 MAY NOT ACTUALLY BE A CONSTANT (JUST TYPE UNKNOWN)
44200	
44300	        NOW TYPE IN A FUNCTION NAME OR THE WORD NIL FOR F1,F2
44400	        AND A CONSTANT OR TH WORD UNKNOWN FOR C1,C2 :
44500	       F1 ...";
44600	     F1←READ();
44700	     PRINTSTR '"      F2 ..."; 
44800	     F2 ← READ();
44900	     PRINTSTR '"       C1 ...";
45000	     C1 ← READ();
45100	     PRINTSTR '"       C2 ...";
45200	     C2 ← READ();
45300	     EXAMPLE[1] ← <C1,C2>;
45400	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? ";
45500	     PRINTSTR '"Y OR N ...";
45600	     I ← READ();
45700	     IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
45800	     IF GOODEX AND F1 THEN C1←F1(GOODEX[1]);
45900	     IF GOODEX AND F2 THEN C2←F2(GOODEX[1]);
46000	     PRINTSTR '"IS THERE ANOTHER TRIVIAL CASE? Y OR N...";
46100	     I←READ();
46200	                 IF I='N THEN BEGIN
46300	      C3←T; C4←UNKNOWN;
46400	      F8←'FALSE; F9←'FALSE;
46500	       END 
46600	     ALSO RETURN NIL;
46700	     PRINTSTR '"FOR SOME FUNCTIONS F8,F9,  AND SOME CONSTANTS C3,C4
46800	       WHEN F8(ARGUMENT)=C3  HEN THE VALUE OF YOUR FUNCTION
46900	         IS C3=F9(ARGUMENT)
47000	           NOTE: C4 MAY NOT ACTUALLY BE A CONSTANT (SAY UNKNOWN)
47100	
47200	        AS BEFORE, TYPE IN SOMETHING FOR ....
47300	                  F8  F9  C3  C4       HERE:";
47400	     F8←READ();F9←READ();C3←READ();C4←READ();
47500	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? 
47600	        Y OR N ...";
47700	     I←READ();
47800	     IF I='Y THEN I←GETEX(3) ALSO ONEX←ONEX+1 ALSO GOODEX2←EXAMPLE[3];
47900	     IF GOODEX2 AND F8 THEN C3←F8(GOODEX2[1]);
48000	     IF GOODEX2 AND F9 THEN C4←F9(GOODEX2[1]);
48100	     RETURN NIL; END;
48200	EXPR RANK(K,LL);
48300	     BEGIN NEW VAL, EXCHANGE,TEMP,OLDR,RL;
48400	     L←LL;
48500	     IF NULL(L[K]) THEN 
48600	       (IF K=7 THEN RETURN '(PI22) ELSE RETURN '(IDEN));
48700	     IF FSUB(K) THEN RETURN <FSUB(K)>;
48800	     VAL←NIL;
48900	     II←NIL;
49000	     II←L[K];
49100	     L←II;
49200	     LEN ← LENGTH(L);
49300	     OLDL←L;
49350	     IF NVARIABLES=2 THEN EXCHANGE←PF ALSO PF←P2F;
49400	     FOR NEW II ←1 TO LEN  DO
49500	     BEGIN
49600	       I←L[II];
49700	       IF MEMBER(I,KNOWNF) AND
49800	           GET(I,'RVAL) AND
49900	           GET(I, PF[K]) AND NOT(GET(I,PF[K])=0) THEN
50000	         VAL[II] ← TIMES( GET(I,PF[K]), GET(I,'RVAL))
50100	       ELSE VAL[II] ← 1000;
50200	     END;
50300	     IF GREATERP(MSGLEVEL,20) THEN
50400	       PRINT(<'VAL,VAL,'L,L>);
50500	     FOR NEW KOUNTER←1 TO LEN DO
50600	     FOR NEW I1←1 TO LEN-1 DO
50700	     FOR NEW I2←I1+1 TO LEN DO
50800	       IF GREATERP(VAL[I1],VAL[I2]) THEN BEGIN
50900	         TEMP←VAL[I1]; VAL[I1]←VAL[I2]; VAL[I2]←TEMP;
51000	         TEMP←L[I1]; L[I1]←L[I2]; L[I2]←TEMP;
51100	       END;
51200	       RL←L;
51250	     IF NVARIABLES=2 THEN PF←EXCHANGE;
51300	     TEMP← FOR NEW J←1 TO LEN COLLECT
51400	     BEGIN IF VAL[J]=1000 THEN RETURN NIL
51500	       ELSE RETURN <L[J]>;
51600	       END;
51700	     L ← TEMP;
51800	     IF GREATERP(MSGLEVEL,9) THEN PRINT (<'OLDL,OLDL,'RANKEDL,
51900	       RL, 'CHOPPEDL, L>);
52000	     RETURN L;
52100	     END;
52200	EXPR FINALIZE();
52300	     BEGIN 
52400	     IF F4='FN THEN F4←FN; IF F6='FN THEN F6←FN;
52500	     EVAL <'DE, FN, '(L),
52600	       <'COND, <<'EQUAL, <F1, 'L>, C1>, <F2,'L>>,
52700	               <<'EQUAL, <F8, 'L>, C3>, <F9, 'L>>,
52800	               <'T,<F7, <F4, <F3, 'L>>,
52900	                        <F6, <F5, 'L>>>>>>;
53000	     RETURN KEEP();
53100	     END;
53200	EXPR PERMANENT();
53300	     BEGIN NEW I;
53400	     EVAL '(OUTC (OUTPUT DSK: PW1KNOWNF) NIL);
53500	     PRINT(<KNOWNF,TARG,NARG,TRE,
53600	       BA1,BA2> );
53700	     EVAL '(OUTC NIL T);
53800	     END;
53900	EXPR KEEP();
54000	     BEGIN NEW I;
54100	     PRINTSTR '"THE ANSWER TO YOUR REQUEST IS";
54200	     PRINT (EVAL(LHOLD));
54300	     PRINTSTR '"
54400	
54500	     DO YOU WISH TO ENTER THIS FUNCTION AS A PERMANENT PART
54600	          OF THE SYSTEM?  Y OR N...";
54700	     I←READ();
54800	     IF I='N THEN RETURN NIL;
54900	     I← PERMANENT();
55000	     IF GREATERP(MSGLEVEL,23) THEN PRINT
55100	     (<'KNOWNF,KNOWNF,'TARG,TARG,'NARG,NARG,'TRE,TRE,'BA1,
55200	      BA1,'BA2,BA2>);
55300	     RETURN NIL; END;
55400	EXPR READINKNOWN();
55500	     BEGIN NEW I;
55600	     I←EVAL '(INC (INPUT DSK: PW1KNOWNF) NIL);
55700	     IDATA←NIL;
55800	     IDATA← READ();
55900	     I←EVAL '(INC NIL T);
56000	     IF GREATERP(MSGLEVEL ,24) THEN PRINT (<'IDATA,
56100	       IDATA>);
56200	     RETURN NIL; END;
     

00100	EXPR GETT2F();
00200	     BEGIN
00250	     T2F←NIL; P2F←NIL;
00300	     T2F[1]← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 14 14 25 14
00400	        14 0 0 7 7 0 25 0 25 0 0 25 25 0 25);
00500	     T2F[2] ← '(10 10 0 7 0 0 25 14 14 14 14 25 25 14 0 0 0 0 0
00600	              0 25 14 0 0
00700	       25 0 25 0 10 10 25 0 0 0);
00800	     T2F[3] ← T2F[2];
00900	     T2F[4] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0
01000	           0 25 25 25 25 25 25 0 0 7 7 0 25 0
01100	       25 0 0 24 14 0 14);
01200	     T2F[5] ← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
01300	       0 0 0 0  0 25 25 0 0
01400	       14 0 10 0 14 14 14 0 0 0);
01500	     T2F[6]← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0 
01600	       0 0 0 0 0 25 25 0 0
01700	       25 0 10 0 14 14 14 0 0 0);
01800	     T2F[7]← T2F[1];
01900	     T2F[8]← T2F[2];
02000	     T2F[9] ← T2F[3];
02100	     T2F[10] ← T2F[4];
02200	     T2F[11] ← T2F[5];
02300	     T2F[12] ← T2F[6];
02400	     T2F[13] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0 0 25 25 25 25 25 14
02500	       0 0 14 14 0 25 0 25 0 0 25 20 0 14);
02600	     T2F[14] ← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 15 15 15 15 25 0
02700	       0 7 10 0 25 0 25 0 0 24 20 0 10);
02800	     T2F[15] ← '(7 10 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0
02900	         0 25 25 0 0 25 0 25 0 14 14 0 0 0 0);
03000	     T2F[16] ← T2F[15];
03100	     T2F[17] ← T2F[14];
03200	     T2F[18] ← '(10 7 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0 0 
03300	       25 25 0 0 25 0 25 0 14 14 0 0 0 0 );
03400	     T2F[19] ← T2F[18];
03500	     END;
03600	EXPR GS2();
03700	     BEGIN
03800	     SCHEMA2 ← '(DE FN2(L M)  (COND
03900	     ((AND ((CAR (GET F2 TARGS)) L)
04000	           ((CAR (GET F3 TARGS)) M)
04100	           ((CAR (GET F1 TARGS)) (F2 L))
04200	           ((CADR (GET F1 TARGS)) (F3 M))
04300	           (EQUAL (F1 (F2 L) (F3 M)) C1)
04400	           ((CAR (GET F5 TARGS)) L)
04500	           ((CAR (GET F6 TARGS)) M)
04600	           ((CAR (GET F4 TARGS)) (F5 L))
04700	           ((CADR (GET F4 TARGS)) (F6 M)))
04800	       (F4 (F5 L) (F6 M)))
04900	     ((AND ((CAR (GET F8 TARGS)) L)
05000	           ((CAR (GET F9 TARGS)) M)
05100	           ((CAR (GET F7 TARGS)) (F8 L))
05200	           ((CADR (GET F7 TARGS)) (F9 M))
05300	           (EQUAL (F7 (F8 L) (F9 M)) C3)
05400	            ((CAR (GET F11 TARGS)) L)
05500	           ((CAR (GET F12 TARGS)) M)
05600	           ((CAR (GET F10 TARGS)) (F11 L))
05700	           ((CADR (GET F10 TARGS)) (F12 M)))
05800	      (F10 (F11 L) (F12 M) )  )
05900	
06000	     ((OR (GT2 L M) 
06100	          (AND (INFINITY)
06200	               ((CAR (GET F16 TARGS)) M)
06300	               ((CAR (GET F15 TARGS)) L)
06400	               ((CAR (GET F14 TARGS)) (F15 L))
06500	               ((CADR (GET F14 TARGS)) (F16 M))
06600	               ((CAR (GET F18 TARGS)) L)
06700	               ((CAR (GET F19 TARGS)) M)
06800	               ((CAR (GET F17 TARGS)) (F18 L))
06900	               ((CADR (GET F17 TARGS)) (F19 M))
07000	               ((CAR (GET F13 TARGS))
07100	                        (SETQ CE1 (F14 (F15 L) (F16 M))))
07200	               ((CADR (GET F13 TARGS))
07300	                        (SETQ CE2 (F17 (F18 L) (F19 M))))))
07400	      (F13 CE1 CE2))
07500	     (T C2))  ); 
07600	     IF GREATERP(MSGLEVEL, 54) THEN PRINTSTR '" SCHEMA TWO IS";
07700	     IF GREATERP(MSGLEVEL, 53) THEN PRINT (SCHEMA2);
07800	     RETURN NIL;
07900	     END;
08000	EXPR REC2(FN,A,N,RELATEDF);
08100	     BEGIN NEW I,II,I1,I2,KK,JJ1,JJ2;
08200	     EE1←NIL;
08300	     EE2 ← NIL;
08400	     L1← NIL;
08500	     L2 ← NIL;
08600	     E←NIL;
08700	     MA←T;
08800	     MN←T;
08900	     MAL←T;
09000	     MA2 ←T;
09100	      MN2←T;
09200	     MAL2←T;
09300	     E1←NIL;
09400	     E2←NIL;
09500	     EXAMPLE[NEX+2,1]←<L,CADADR(A)>;
09600	     FOR NEW X←1 TO NEX+1 DO BEGIN
09700	       E1← EXAMPLE[X+1,1,1];
09800	       E2← EXAMPLE[X+1,1,2];
09900	     MA← MA AND ATOM(E1);
10000	     MA2← MA2 AND ATOM(E2);
10100	     MN ← MN AND NUMBER(E1);
10200	     MN2 ← MN2 AND NUMBER(E2);
10300	     MAL ← MAL AND ANYLIST(E1);
10400	     MAL2 ← MAL2 AND ANYLIST(E2);
10500	     END;
10600	     I← '(ANY ANY);
10700	     IF MAL THEN I[1] ← 'ANYLIST;
10800	     IF MAL2 THEN I[2] ← 'ANYLIST;
10900	     IF MA THEN I[1] ← 'ATOM;
11000	     IF MA2 THEN I[2] ← 'ATOM;
11100	     IF MN THEN I[1] ← 'NUMBER;
11200	     IF MN2 THEN I[2] ← 'NUMBER;
11300	     PUTPROP ('FN2, I, 'TARGS);
11400	     PUTPROP ('FN2, 2, 'NARGS);
11500	     PUTPROP ('FN2, 'ANY, 'TRES);
11600	     IHOLD← I;
11700	     PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS FOR THE FN?
11800	        MY GUESS IS";
11900	     PRINC (IHOLD);
12000	     PRINTSTR '"     ANSWER N MEANS GUESS IS OK,
12100	       ANSWER Y MEANS YOU WANT TO CHANGE MY GUESS ...";
12200	     I←READ();
12300	     IF I='Y THEN BEGIN
12400	      PRINTSTR '"TYPE IN TWO OF THE WORDS:
12500	     ANY  ANYLIST  NUMBER  LISTP
12600	                          ( LISTP MEANS A NONNULL LIST)...";
12700	     I ← READ();
12800	     II ← READ();
12900	     IHOLD ← <I,II>;
13000	      PUTPROP('FN2, IHOLD, 'TARGS);
13100	     END;
13200	     FOR NEW K←1 TO 19 DO
13300	     ORD[K]←INTERSECTION(RELATEDF[1]@RELATEDF[2]@<'FN2>
13400	       @RELATEDF[3]@RELATEDF[4], ORDER2[K]);
13500	     FOR NEW K←1 TO 19 DO
13600	       ORD[K] ← RANK(K,ORD);
13700	     PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES?";
13800	     I←READ();
13900	     IF I='Y THEN  FOR NEW X←1 TO 19 DO
14000	     BEGIN
14100	     PRINT <'ORD,X,ORD[X]>;
14200	     PRINTSTR '"NOW RETYPE THIS SECTION OF ORD:";
14300	     I←READ();
14400	     IF NOT(I='S) THEN ORD[X]←I;
14500	     END;
14600	     IF C1='UNKNOWN THEN C1=T;
14700	     IF C3='UNKNOWN THEN C3=T;
14800	     I←NIL; II←NIL;
14900	     LIMINF←LIMINFBASE;
15000	     TAGF1 ← F1;
15100	    TAGF7 ← F7;
15200	    FOR NEW T2 ← 1 TO LENGTH(ORD[2]) DO BEGIN
15300	       F2 ← ORD[2,T2];
15400	     IF GREATERP(MSGLEVEL,0) THEN
15500	       PRINT <2,'T2,T2,'F2,F2>;
15600	     IF GREATERP(MSGLEVEL,49) THEN
15700	     PRINT<'L,L,'RELATEDFUNCTIONS,RELATEDF,'ORD,ORD>;
15800	     IF FOR NEW X← 2 TO NEX+1; AND
15900	        MAT(EXAMPLE[X,1],F2)        THEN
16000	     FOR NEW T3 ← 1 TO LENGTH(ORD[3]) DO BEGIN
16100	       F3←ORD[3,T3];
16200	     IF GREATERP(MSGLEVEL,1) THEN
16300	        PRINT <3,'T3,T3,'F3,F3>;
16400	      IF FOR NEW X←2 TO NEX+1; AND
16500	        MAT3(EXAMPLE[X,1],F3) THEN
16600	        FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
16700	        F1← ORD[1,T1];
16800	       IF GREATERP(MSGLEVEL,2) THEN PRINT <1,'T1,T1,'F1,F1>;
16900	       IF FOR NEW X←2 TO NEX+1; AND
17000	           MAT2(EXAMPLE[X,1],F1,F2,F3) AND
17100	           (TAGF1 OR GOODEX=NIL OR F1(F2 (GOODEX[1,1]),
17200	             F3(GOODEX[1,2]))=C1) THEN
17300	     FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
17400	     F5 ← ORD[5,T5];
17500	     IF GREATERP(MSGLEVEL,4) THEN PRINT<5,'T5,T5,'F5,F5>;
17600	      IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F5) THEN
17700	     FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
17800	     F6 ← ORD[6,T6];
17900	     IF GREATERP(MSGLEVEL,5) THEN PRINT <6,'T6,T6,'F6,F6>;
18000	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F6) THEN
18100	     FOR NEW T4← 1 TO LENGTH(ORD[4]) DO BEGIN
18200	     F4←ORD[4,T4];
18300	     IF GREATERP(MSGLEVEL,6) THEN PRINT <4,'T4,T4,'F4,F4>;
18400	     IF FOR NEW X←2 TO NEX+1; AND
18500	       MAT2(EXAMPLE[X,1],F4,F5,F6) AND
18600	       (LENGTH(ORD[4])=1 OR C2=NIL OR C2=UNKNOWN
18700	         OR F4(F5(L),F6(M))=C2)  THEN
18800	     FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
18900	     F8←ORD[8,T8];
19000	     IF GREATERP(MSGLEVEL,6) THEN PRINT <8,'T8,T8,'F8,F8>;
19100	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F8) THEN
19200	     FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
19300	     F9 ← ORD[9,T9];
19400	     IF GREATERP(MSGLEVEL,7) THEN PRINT <9,'T9,T9,'F9,F9>;
19500	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F9) THEN
19600	     FOR NEW T7←1 TO LENGTH(ORD[7]) DO  BEGIN
19700	     F7←ORD[7,T7];
19800	     IF GREATERP(MSGLEVEL,8) THEN PRINT <7,'T7,T7,'F7,F7 >;
19900	     IF FOR NEW X←2 TO NEX+1; AND
20000	       MAT2(EXAMPLE[X,1],F7,F8,F9) AND
20100	       (TAGF7 OR GOODEX2=NIL OR
20200	        F7(F8(GOODEX2[1,1]),F9(GOODEX2[1,2]))=C3) THEN
20300	     FOR NEW T11←1 TO LENGTH(ORD[11]) DO BEGIN
20400	     F11←ORD[11,T11];
20500	     IF GREATERP(MSGLEVEL,9) THEN PRINT <11,'T11,T11,'F11,F11>;
20600	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F11) THEN
20700	     FOR NEW T12←1 TO LENGTH(ORD[12]) DO BEGIN
20800	     F12←ORD[12,T12];
20900	     IF GREATERP(MSGLEVEL,10) THEN PRINT <12,'T12,T12,'F12,F12>;
21000	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F12) THEN
21100	     FOR NEW T10←1 TO LENGTH(ORD[10]) DO BEGIN
21200	     F10←ORD[10,T10];
21300	     IF GREATERP(MSGLEVEL,11) THEN PRINT <12,'T12,T12,'F12,F12>;
21400	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F10,F11,F12) THEN
21500	     FOR NEW T15← 1 TO LENGTH(ORD[15]) DO BEGIN
21600	     F15← ORD[15,T15];
21700	     IF GREATERP(MSGLEVEL,12) THEN PRINT <15,'T15,T15,'F15,F15>;
21800	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F15) THEN
21900	     FOR NEW T16←1 TO LENGTH(ORD[16]) DO BEGIN
22000	     F16←ORD[16,T16];
22100	     IF GREATERP(MSGLEVEL,13) THEN PRINT <16,'T16,T16,'F16,F16>;
22200	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F16) THEN
22300	     FOR NEW T14←1 TO LENGTH(ORD[14]) DO BEGIN
22400	     F14←ORD[14,T14];
22500	     IF GREATERP(MSGLEVEL,14) THEN PRINT <14,'T14,T14,'F14,F14>;
22600	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F14,F15,F16) THEN
22700	     FOR NEW T18←1 TO LENGTH(ORD[18]) DO BEGIN
22800	     F18←ORD[18,T18];
22900	     IF GREATERP(MSGLEVEL,15) THEN PRINT <18,'T18,T18,'F18,F18>;
23000	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F18) THEN
23100	     FOR NEW T19←1 TO LENGTH(ORD[19]) DO BEGIN
23200	     F19←ORD[19,T19];
23300	     IF GREATERP(MSGLEVEL,16) THEN PRINT <19,'T19,T19,'F19,F19>;
23400	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F19) THEN
23500	     FOR NEW T17←1 TO LENGTH(ORD[17]) DO BEGIN
23600	     F17←ORD[17,T17];
23700	     IF GREATERP(MSGLEVEL,17) THEN PRINT <17,'T17,T17,'F17,F17>;
23800	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F17,F18,F19) THEN
23900	     FOR NEW T13←1 TO LENGTH (ORD[13]) DO BEGIN
24000	     F13←ORD[13,T13];
24100	     IF GREATERP(MSGLEVEL,18) THEN PRINT <13,'T13,T13,'F13,F13>;
24200	     I←INNERLOOP();
24300	     RETURN I;
24400	     END UNTIL I
24500	     END UNTIL I
24600	     END UNTIL I
24700	     END UNTIL I
24800	     END UNTIL I
24900	     END UNTIL I
25000	     END UNTIL I
25100	     END UNTIL I
25200	     END UNTIL I
25300	     END UNTIL I
25400	     END UNTIL I
25500	     END UNTIL I
25600	     END UNTIL I
25700	     END UNTIL I
25800	     END UNTIL I
25900	     END UNTIL I
26000	      END UNTIL I
26100	     END UNTIL I
26200	     END UNTIL I;
26300	     IF GREATERP(MSGLEVEL,0) THEN
26400	      PRINT <'F1TOF19,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
26500	        F11,F12,F13,F14,F15,F16,F17,F18,F19,'C1234,C1,C2,
26600	        C3,C4>;
26700	     KNOWNF ← FN2 CONS KNOWNF;
26800	     TARG ← GET('FN,'TARGS) CONS TARG;
26900	     NARG← N CONS NARG;
27000	     TRE ← GET('FN,'TRES) CONS TRE;
27100	     BA2 ← FN2 CONS BA2;
27200	     IF GREATERP(MSGLEVEL,35) THEN PRINT <'KNOWNF,KNOWNF,
27300	       'RELATESDF,RELATEDF,'TARG,TARG,'NARG,NARG,'TRE,
27400	       TRE,'BA2,BA2>;
27500	      PUTPROP(FN2,2,NARGS);
27600	     PUTPROP(FN2,IHOLD,TARGS);
27700	     PUTPROP(FN2,'ANY,TRES);
27800	      FINALIZE2();
27900	     FOR NEW J←1 TO 19 DO PUTPROP(FN2,11,P2F[J]);
28000	     RETURN FN2;
28100	     END;
28200	EXPR PRIM2();
28300	     BEGIN NEW I;
28400	     GOODEX ← NIL;
28500	     GOODEX2 ← NIL;
28600	     ONEX ← 0;
28700	     F1 ← NIL;
28800	     F12 ← NIL;
28900	     F3 ← NIL;
29000	     F2 ← NIL;
29100	     F4 ← NIL;
29200	     F5 ← NIL;
29300	     F6 ← NIL;
29400	     F7 ← NIL;
29500	     F8 ← NIL;
29600	     F9←NIL;
29700	     F10 ← NIL;
29800	     F11 ← NIL;
29900	     PRINTSTR '"THERE IS SOME PRIMITIVE CASE (OR TWO).
30000	     DO YOU KNOW ANYTHING ABOUT IT? Y OR N...";
30100	     I← READ();
30200	     IF I='N THEN  BEGIN
30300	       IF GREATERP(MSGLEVEL,3) THEN PRINTSTR 
30400	       '"I AM ASSUMING F1 THROUGH F12 TO BE NIL,
30500	         C1 AND C3 TO BE T, C2 AND C4 TO BE UNKNOWN";
30600	       C1 ←T;
30700	       C3← T;
30800	       C2← UNKNOWN;
30900	       C4 ← UNKNOWN;
31000	     EXAMPLE[1] ←<C1,C2>;
31100	     RETURN NIL; 
31200	     END  ALSO RETURN NIL;
31300	     PRINTSTR '"FOR SOME FUNCTIONS F1,F2,F3,F4,F5,F6,
31400	     AND SOME CONSTANT C1, WHEN
31500	       F1( F2(ARG1), F3(ARG2) )  =  C1    THEN
31600	     THE VALUE OF YOUR FUNCTION IS 
31700	       F4( F5(ARG1), F6(ARG2) ) = C2
31800	
31900	     NOW TYPE IN NIL OR A FUNCTION NAME FOR F1,F2,F3,F4,F5,F6:";
32000	     F1←READ();
32100	     F2←READ();
32200	     F3←READ();
32300	     F4←READ();
32400	     F5←READ();
32500	     F6←READ();
32600	     PRINTSTR '"NOW TYPE IN A CONSTANT OR THE VALUE UNKNOWN FOR C1";
32700	     C1←READ();
32800	     PRINTSTR '"IF C2 IS A CONSTANT, TYPE IN ITS VALUE. IF IT
32900	     IS NOT CONSTANT, OR IF YOU DONT KNOW THE VALUE,TYPE UNKNOWN";
33000	     C2←READ();
33100	     EXAMPLE[1]←<C1,C2>;
33200	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS
33300	     PRIMITIVE CASE? Y OR N...";
33400	     I←READ();
33500	     IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
33600	     PRINTSTR '"IS THERE ANOTHER PRIMITICE CASE? Y OR N...";
33700	     I←READ();
33800	     IF I='N THEN BEGIN
33900	     C3←T;
34000	    C4←UNKNOWN;
34100	     F7←'FALSE2;
34200	     F8←'FALSE;
34300	     F9←'FALSE;
34400	     F10←'FALSE2;
34500	     F11←'FALSE;
34600	     F12←'FALSE;
34700	     END ALSO RETURN NIL;
34800	     PRINTSTR '"FOR SOME FUNCTIONS F7,F8,F9,F10,F11,F12,
34900	     AND SOME CONSTANT C3, WHEN
35000	       F7( F8(ARG1), F9(ARG2) ) = C3 THEN
35100	     THE VALUE OF YOUR FUNCTION IS
35200	       F10( F11(ARG1), F12(ARG2) ) = C4
35300	
35400	     NOW TYPE IN NIL OR A FUNCTION NAME FOR F7 THROUGH F12:";
35500	     F7←READ();
35600	     F8←READ();
35700	     F9←READ();
35800	     F10←READ();
35900	     F11←READ();
36000	     F12←READ();
36100	     PRINTSTR '"NOW TYPE IN UNKNOWN OR A CONSTANT FOR C3,C4:";
36200	     C3←READ();
36300	     C4←READ();
36400	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS? Y OR N>>>";
36500	     I←READ();
36600	     IF I='Y THEN I←GETEX(3) ALSO ONEX←2 ALSO GOODEX2←EXAMPLE[3];
36700	     RETURN NIL;
36800	     END;
36900	EXPR FSUB(I);
37000	     IF I=1 THEN F1
37100	     ELSE IF I=2 THEN F2
37200	     ELSE IF I=3 THEN F3
37300	     ELSE IF I=4 THEN F4
37400	     ELSE IF I=5 THEN F5
37500	     ELSE IF I=6 THEN F6
37600	     ELSE IF I=7 THEN F7
37700	     ELSE IF I=8 THEN F8
37800	     ELSE IF I=9 THEN F9
37900	     ELSE IF I=10 THEN F10
38000	     ELSE IF I=11 THEN F11
38100	     ELSE IF I=12 THEN F12
38200	     ELSE IF I=13 THEN F13
38300	     ELSE IF I=14 THEN F14
38400	     ELSE IF I=15 THEN F15
38500	     ELSE IF I=16 THEN F16
38600	     ELSE IF I=17 THEN F17
38700	     ELSE IF I=18 THEN F18
38800	     ELSE IF I=19 THEN F19
38900	     ELSE PRINT <'FSUBERROR,'I,I>;
39000	EXPR FINALIZE2();
39100	     BEGIN
39200	     FOR NEW I←1 TO 19 DO
39300	     IF F1='FN2 THEN F1←FN2;
39400	     IF F4='FN2 THEN F4←FN2;
39500	     IF F7='FN2 THEN F7←FN2;
39600	     IF F10='FN2 THEN F10←FN2;
39700	     IF F13='FN2 THEN F13←FN2;
39800	     IF F14='FN2 THEN F14←FN2;
39900	     IF F17='FN2 THEN F17←FN2;
40000	     EVAL <'DE, FN2, '(L M),
40100	     <'COND, <<'EQUAL, <F1, <F2, 'L>,<F3,'M>>,C1>,
40200	                       <F4, <F5, 'L>,<F6, 'M>>>,
40300	                <<'EQUAL,<F7,<F8,'L>,<F9,'M>>,C3>,
40400	                         <F10,<F11,'L>,<F12,'M>>>,
40500	         <T,<F13,<F14,<F15,'L>,<F16,'M>>,
40600	                 <F17,<F18,'L>,<F19,'M>>>>>>;
40700	     RETURN KEEP();
40800	     END;
40900	EXPR FALSE2(A,B); NIL;
41000	EXPR GT2(L,M); OR(GOODEX AND GOODEX[1,1]=L AND GOODEX[1,2]=M,
41100	     GOODEX2 AND GOODEX2[1,1]=L AND GOODEX2[1,2]=M);
41200	EXPR MAT(E ,F);
41300	     GT2(CAR(E),CADR(E)) OR
41400	     EVAL '((CAR (GET F TARGS)) (CAR E));
41500	EXPR MAT2(E,F,G1,G2);
41600	     GT2(CAR(E),CADR(E))  OR
41700	     EVAL '((CAR (GET F TARGS)) (G1 (CAR E))) AND
41800	    EVAL '((CADR (GET F TARGS)) (G2 (CADR E)));
41900	EXPR MAT3(E,F);
42000	     GT2(CAR(E),CADR(E)) OR
42100	     EVAL '((CAR (GET F TARGS)) (CADR E));
42200	EXPR INNERLOOP();
42300	     BEGIN
42400	     I←NIL;
42500	     INF←0;
42600	     IF FOR NEW X←2 TO NEX+1; AND
42700	       BEGIN
42800	       L1←EXAMPLE[X,1,1];
42900	       L2←EXAMPLE[X,1,2];
43000	       I← EVAL '((CAR (GET F13 TARGS))
43100	                 (SETQ EE1 (F14 (F15 L1) (F16 L2))));
43200	     IF I THEN I← EVAL '((CADR (GET F13 TARGS))
43300	                 (SETQ EE2 (F17 (F18 L1) (F19 L2))));
43400	     IF I THEN I←(EVAL '(FN2 EE1 EE2) = EXAMPLE[X,2]);
43500	       RETURN I;
43600	       END
43700	     THEN PRINTSTR '"HOORAY, SUCCESS!!!" 
43800	       ALSO RETURN I;
43900	     END;
44000	END.